package com.example.controller;

import com.example.exception.BusinessException;
import com.example.pojo.Result;
import com.example.utils.FileUtil;
import org.apache.commons.io.FileUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;

/**
 * 文件操作的前端控制器
 */
@Controller
public class FileController {

    @PostMapping("/upload")
    @ResponseBody
    public Result uploadFile(MultipartFile file) {
        //上传文件到本地路径
        String uploadPath = FileUtil.localUpload(file);
        //构建返回结果 上传的文件名称&保存的路径,如果实现了下载，则可以返回下载的路径
        HashMap<String, Object> result = new HashMap<>();
        result.put("fileName", file.getOriginalFilename());
        result.put("filePath", uploadPath);
        return Result.success(result);
    }

    /**
     * 处理文件下载请求的方法。
     *
     * @param request HTTP 请求对象，用于获取请求信息。
     * @param fileName 要下载的文件名。
     * @return 包含文件内容的 ResponseEntity 对象，或者返回服务器错误状态码。
     */
    @GetMapping("/download")
    public ResponseEntity<byte[]> download(String fileName) {
        // 获取文件上传路径,并校验
//        String uploadPath = FileUtil.uploadPath;
        if(fileName == null || fileName.trim() == ""){
            throw  new BusinessException(500,"文件路径为空");
        }
//        uploadPath + File.separator +
                // 构建文件对象
        File file = new File(fileName);
        if (!file.exists() || !file.isFile()){
            throw  new BusinessException(500,"文件不存在");
        }
        // 设置 HTTP 响应头
        HttpHeaders httpHeaders = new HttpHeaders();
        // 设置文件下载方式为附件，并指定文件名
        httpHeaders.setContentDispositionFormData("attachment", file.getName());

        // 设置响应内容类型为二进制流
        httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);

        try {
            // 读取文件内容并返回响应
            return new ResponseEntity<>(FileUtils.readFileToByteArray(file), httpHeaders, HttpStatus.OK);
        } catch (IOException e) {
            // 发生异常时返回服务器内部错误状态码
            throw  new BusinessException(500,"文件上传失败");
//            return new ResponseEntity<>(null, httpHeaders, HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }



}